package com.smdp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smdp.dto.Result;
import com.smdp.entity.Voucher;
import com.smdp.entity.VoucherSchedule;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

import java.io.IOException;

import static com.smdp.utils.RabbitMQConstants.DELAYED_QUEUE;

/**
 * 预约秒杀券服务接口。
 * 包含预约秒杀券（用户调用）、新增秒杀券提醒（商户新增秒杀券时调用）、声明交换机、监听秒杀MQ队列、发送短信任务和发送短信的线程池。
 * 其中，秒杀券提醒逻辑为：商户新增秒杀券->新增秒杀券提醒，发送到RabbitMQ->秒杀开始，监听到RabbitMQ消息->开启独立线程->
 * 向所有预约了秒杀券的用户发送短信。
 *
 * @author 蔡方珩
 */
public interface IVoucherScheduleService extends IService<VoucherSchedule> {
    /**
     * 预约秒杀券
     * @param voucherId 秒杀券id
     * @return 成功：优惠券id / 失败：失败原因
     */
    Result scheduleSeckillVoucher(Long voucherId);
    /**
     * 新增秒杀券时，新增秒杀开始提醒
     * @param voucher 新增的秒杀券
     */
    void addVoucherSchedule(Voucher voucher);
    /**
     * 监听秒杀提醒MQ队列。秒杀开始时，开启新线程，将优惠券信息推送给用户。
     *
     * @param message MQ消息
     * @param channel channel
     */
    @RabbitListener(queues = DELAYED_QUEUE)
    void handleSchedule(Message message, Channel channel) throws IOException;
}
